03 - Podstawowe funkcje OpenCV
Przetwarzanie i Analiza Obrazów
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 3: Podstawowe funkcje OpenCV.
Powrót do spisu treści ćwiczeń laboratoryjnych
W tym ćwiczeniu:
Konwersja kolorów i przestrzenie barw.
Skalowanie obrazów.
Histogramy.
1. Cel ćwiczenia
Celem ćwiczenia jest poznanie podstawowych funkcji OpenCV używanych w codziennej pracy z obrazem: konwersji kolorów, zmiany rozmiaru obrazu oraz analizy histogramów.
2. Wstęp teoretyczny
Przed wykonaniem zadań przeczytaj poniższe informacje i uruchom przykłady. Zwróć uwagę nie tylko na składnię funkcji, ale też na to, po co używa się ich w praktyce.
2.1. Konwersja kolorów i przestrzenie barw
Obraz kolorowy można reprezentować w różnych przestrzeniach barw. W
OpenCV domyślnie używany jest zapis BGR, ale w zależności
od zadania wygodniejsze mogą być inne reprezentacje.
Najczęściej spotykane przestrzenie barw:
BGR- domyślna reprezentacja w OpenCV; dobra do wyświetlania i podstawowych operacji.GRAY- obraz w skali szarości; używany, gdy kolor nie jest potrzebny, np. przy progowaniu, detekcji krawędzi czy analizie jasności.HSV- rozdziela informację o barwie, nasyceniu i jasności; bardzo przydatna przy segmentacji kolorów.RGB- często używana poza OpenCV, np. w bibliotekach takich jakmatplotlib.
Po co wykonuje się konwersję kolorów:
aby uprościć dane wejściowe, np. przejść z obrazu kolorowego do skali szarości,
aby łatwiej wykrywać obiekty o określonym kolorze,
aby dopasować obraz do wymagań konkretnego algorytmu.
W OpenCV konwersję wykonuje się funkcją
cv2.cvtColor(...).
Dokumentacja: https://docs.opencv.org/5.x/df/d9d/tutorial_py_colorspaces.html
2.1.1. Przykład - konwersja do skali szarości i HSV
import cv2
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('Oryginal', img)
cv2.imshow('Gray', gray)
cv2.imshow('HSV', hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()Uwaga: Obraz w przestrzeni
HSVpo zwykłym wyświetleniu nie będzie wyglądał „naturalnie”, ale nadal zawiera informacje użyteczne do dalszego przetwarzania, np. filtrowania koloru.
2.2. Skalowanie obrazów
Skalowanie polega na zmianie rozmiaru obrazu. Jest to potrzebne między innymi wtedy, gdy:
obraz jest zbyt duży do wygodnego wyświetlania,
chcesz przyspieszyć działanie algorytmu,
musisz dopasować rozmiar obrazu do innego obrazu lub modelu,
porównujesz wpływ różnych metod interpolacji na jakość wyniku.
Do zmiany rozmiaru używa się funkcji
cv2.resize(...).
Najczęściej spotykane metody interpolacji:
cv2.INTER_NEAREST- najszybsza, ale daje słabszą jakość.cv2.INTER_LINEAR- uniwersalna i często domyślna.cv2.INTER_AREA- dobra przy zmniejszaniu obrazu.cv2.INTER_CUBIC- lepsza jakość przy powiększaniu, kosztem czasu.
Dokumentacja: https://docs.opencv.org/5.x/da/d54/group__imgproc__transform.html
2.2.1. Przykład - zmiana rozmiaru obrazu
import cv2
img = cv2.imread('image.jpg')
small = cv2.resize(img, (200, 200))
big = cv2.resize(img, None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)
cv2.imshow('Oryginal', img)
cv2.imshow('Pomniejszony', small)
cv2.imshow('Powiekszony', big)
cv2.waitKey(0)
cv2.destroyAllWindows()Uwaga: Gdy korzystasz z
fxify, parametr rozmiaru ustaw na(0, 0)lubNone. Gdy podajesz dokładny rozmiar docelowy, użyj argumentudsize=(szerokosc, wysokosc).
2.3. Histogramy
Histogram obrazu pokazuje, ile pikseli ma daną wartość jasności lub daną wartość w wybranym kanale koloru. Jest to proste, ale bardzo użyteczne narzędzie do analizy obrazu.
Po co analizuje się histogram:
aby ocenić, czy obraz jest ciemny, jasny lub ma niski kontrast,
aby porównać rozkład jasności przed i po przetwarzaniu,
aby dobrać parametry progowania,
aby analizować kanały koloru osobno.
W OpenCV histogram można obliczyć funkcją
cv2.calcHist(...).
Dokumentacja: https://docs.opencv.org/5.x/d1/db7/tutorial_py_histogram_begins.html
2.3.1. Przykład - histogram obrazu w skali szarości
Uwaga: Może być konieczne zainstalowanie biblioteki
matplotlibdo wyświetlania wykresów:pip install matplotlib.
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.title('Histogram obrazu grayscale')
plt.xlabel('Wartosc piksela')
plt.ylabel('Liczba pikseli')
plt.plot(hist)
plt.xlim([0, 256])
plt.show()Uwaga: Jeśli większość wartości histogramu skupia się po lewej stronie, obraz jest raczej ciemny. Jeśli po prawej stronie, obraz jest raczej jasny. Wąski histogram zwykle oznacza niski kontrast.
3. Zadania do samodzielnego wykonania
Każde zadanie wykonaj w osobnym pliku Python (zad1.py,
zad2.py, …).
💥 Zadanie 1 - Konwersja do różnych przestrzeni barw 💥
Wczytaj wybrany obraz kolorowy.
Przekonwertuj go do skali szarości korzystając z
cv2.COLOR_BGR2GRAY.Wczytaj ten sam obraz do innej zmiennej korzystając z
cv2.imread(..., cv2.IMREAD_GRAYSCALE).Porównaj oba obrazy w skali szarości, sprawdź, czy są identyczne.
💥 Zadanie 2 - Wydzielenie koloru w przestrzeni HSV 💥
Wczytaj obraz zawierający wyraźny obiekt w wybranym kolorze, np. czerwonym, zielonym lub niebieskim.
Przekonwertuj obraz do przestrzeni
HSV.Zastosuj
cv2.inRange(...), aby wyznaczyć maskę dla wybranego koloru.Wyświetl obraz wejściowy, maskę i wynik po nałożeniu maski.
Uwaga: To zadanie pokazuje, dlaczego przestrzeń
HSVjest często wygodniejsza odBGRprzy segmentacji kolorów.
💥 Zadanie 3 - Skalowanie obrazu i porównanie interpolacji 💥
Wczytaj wybrany obraz.
Zmniejsz go dwukrotnie, korzystając z
cv2.INTER_AREA.Powiększ go dwukrotnie, korzystając kolejno z:
cv2.INTER_NEAREST,cv2.INTER_LINEAR,cv2.INTER_CUBIC.
Wyświetl wyniki w osobnych oknach.
Porównaj wizualnie jakość uzyskanych obrazów i zapisz krótką obserwację.
💥 Zadanie 4 - Histogramy kanałów koloru 💥
Wczytaj obraz kolorowy.
Oblicz osobne histogramy dla kanałów
B,GiR(możesz to zrobić na raz lub osobno dla każdego kanału).Wyświetl wszystkie trzy histogramy na jednym wykresie.
Porównaj, który kanał ma największy udział i jak wpływa to na wygląd obrazu.